/****************************************************************************
**
** Copyright (C) 2011 Jesús Martínez Pérez
**
** This program is free software: you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the 
** Free Software Foundation, either version 3 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but 
** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along 
** with this program. If not, see <http://www.gnu.org/licenses/>
**
****************************************************************************/
/*
 * lz77.h
 *
 *		Created on: 22/05/2010
 *		Author: Jesús Martínez Pérez
 */
#ifndef _LZ77_H_
#define _LZ77_H_
#include <iostream>
#include <libvd.h>
#include <iostream>
using namespace std;
/**
 * \class LZ77
 *
 *
 * \brief	Esta clase hace posible realizar una codificacion Lempel-Ziv (LZ77)
 				sobre un vector dinamico de unsigned char (VD_unsignedchar) y almacenar el resultado
 				en un vector dinamico de unsigned int (VD_unsignedint).
 *         
 *
 * \author Jesús Martínez Pérez 
 *
 *
 * \date $Date: 22/05/2010 $
 *
 */
class LZ77{
	private:
		VD_unsignedchar vc;
		VD_unsignedint vi;
	public:
/**
@brief Constructor por defecto
*/
		LZ77();
/**
@brief	Constructor por parametros
@param[in] c un vector dinámico de unsigned char
@param[in] i un vector dinámico de unsigned int
*/
		LZ77(VD_unsignedchar c,VD_unsignedint i);
/**
@brief	Metodo que se encarga de realizar la codificación Lempel-Ziv leyendo
			un vector vc y almacenando el resultado codificado en vi 
*/
		void Codifica();
/**
@brief Consulta el tamaño del vector de unsigned char que contiene el objeto de la clase LZ77
@return Un entero
*/		
		int tamvc()const;
/**
@brief Realiza el algoritmo CRC32 sobre el vector dinámico de unsigned char y lo devuelve
@return Un valor unsigned int que es solucion de aplicar el algoritmo crc32
*/
		unsigned int CRC32()const;
/**
@brief Consulta el valor que contiene una posicion en el vector dinámico de unsigned int 
@return Un valor unsigned int
*/	
		unsigned int Get(int i)const;	
/**
@brief Consulta el vector dinámico de unsigned char que conetiene el objeto de la clase LZ77 
@return Un vector dinámico de unsigned char
*/	
		VD_unsignedchar Getvc()const;
/**
@brief Consulta el vector dinámico de unsigned int que conetiene el objeto de la clase LZ77 
@return Un vector dinámico de unsigned int
*/	
		VD_unsignedint Getvi()const;
/** 
@brief Sobrecarga del operador de asignación sobre un objeto de la clase LZ77
*/
		LZ77 & operator=(const LZ77 &l);
/** 
@brief Sobrecarga del operador de entrada
*/
		friend istream & operator>>(istream &is,LZ77 &l);
/** 
@brief Sobrecarga del operador de salida
*/
		friend ostream & operator<<(ostream &os, LZ77 &l);
};
#endif
